/**
 * 
 */
package capaservicio;

import java.util.ArrayList;
import java.util.HashMap;

import solucion.*;

import org.orm.PersistentException;
import org.orm.PersistentTransaction;

import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import solucion.PrestacionesClinicasPersistentManager;
import solucion.dao.PacienteDAO;

import capalogica.ValidarCampos;

/**
 * The Class PacienteORM.
 *
 * @author Yuri
 */
public class PacienteORM {
	
	/** The valida. */
	ValidarCampos valida = new ValidarCampos();
	
	/**
	 * Instantiates a new paciente orm.
	 */
	public PacienteORM (){
		
	}

/**
 * Ingresar paciente.
 *
 * @param cuerpo the cuerpo
 * @param identifica the identifica
 * @param nombre the nombre
 * @param Direccion the direccion
 * @return true, if successful
 */
public int ingresarPaciente(String contPaciente)
{
	int resultado = 0;
	if(contPaciente != null && !contPaciente.isEmpty()){
		JsonParser jsonParser = new JsonParser();
		JsonObject paciente = jsonParser.parse(contPaciente).getAsJsonObject();
		//Validar parametros recibidos no nulos
		System.out.println("paciente recibido en servicio: "+paciente);
		if(paciente.has("cuerpo")&&paciente.has("identifica")&& paciente.has("nombre") && paciente.has("direccion")){
			if(valida.verificarRun(paciente.get("cuerpo").getAsInt(),paciente.get("identifica").getAsString())){
				try {
					 //PersistentTransaction transaccion = BasededatosPersistentManager.instance().getSession().beginTransaction();
					 	PersistentTransaction transaccion = PrestacionesClinicasPersistentManager.instance().getSession().beginTransaction();
						try{
					 		//se crea la instacia para crear a un paciente
							DAOFactory lDaoFactoy = DAOFactory.getDAOFactory();
							PacienteDAO pacienteDAO = lDaoFactoy.getPacienteDAO();
							Paciente crearPaciente = pacienteDAO.createPaciente();
					 		crearPaciente.setRut(paciente.get("cuerpo").getAsString()+"-"+paciente.get("identifica").getAsString());
					 		crearPaciente.setNombre(paciente.get("nombre").getAsString());
					 		crearPaciente.setDireccion(paciente.get("direccion").getAsString());
					 		//guarda paciente
					 		pacienteDAO.save(crearPaciente);
					 		transaccion.commit();
					 		resultado=1;
					 	}catch (Exception e) {
							// TODO: handle exception
					 		transaccion.rollback();
						}
					} catch (PersistentException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
			}
		}
	}

	return resultado;
}

/**
 * Actualizar campos tabla paciente con atributos tales como: nombre y direccion 
 * @param contPaciente json recibido
 * @return 1 si se a actualizado el registro.
 */
public int updatePaciente(String contPaciente)
{
	int resultado = 0;
	if(contPaciente != null && !contPaciente.isEmpty()){
		JsonParser jsonParser = new JsonParser();
		JsonObject paciente = jsonParser.parse(contPaciente).getAsJsonObject();
		//Validar parametros recibidos no nulos
		System.out.println("paciente recibido en servicio: "+paciente);
		if(paciente.has("cuerpo")&&paciente.has("identifica") && paciente.has("nombre") && paciente.has("direccion")){
			//Obtine Clasificacion y Genero
			PersistentTransaction transaccion = null;
			try {
				transaccion = PrestacionesClinicasPersistentManager.instance().getSession().beginTransaction();
				DAOFactory lDaoFactoy = DAOFactory.getDAOFactory();
				PacienteDAO pacienteDAO = lDaoFactoy.getPacienteDAO();
				Paciente upPaciente = pacienteDAO.loadPacienteByORMID(paciente.get("cuerpo").getAsString()+"-"+paciente.get("identifica").getAsString());
				System.out.println(upPaciente.getNombre());
				upPaciente.setNombre(paciente.get("nombre").getAsString());
				upPaciente.setDireccion(paciente.get("direccion").getAsString());
				//upPaciente.setRut(paciente.get("rut").getAsString());
				pacienteDAO.save(upPaciente);
				resultado = 1;
				transaccion.commit();
			} catch (PersistentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				try {
					transaccion.rollback();
				} catch (PersistentException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}finally{
				try {
					PrestacionesClinicasPersistentManager.instance().getSession().flush();
					PrestacionesClinicasPersistentManager.instance().disposePersistentManager();
				} catch (PersistentException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	return resultado;

}
	
/**
 * Obtener listado de todos los paciente.
 * @param prestacion the prestacion
 * @return the string
 */
public String obtenerPacientes()
{
	String resultJSON = "";
	ArrayList<HashMap<String, Object>> listaPacientes = new ArrayList<HashMap<String,Object>>();

	DAOFactory lDaoFactoy = DAOFactory.getDAOFactory();
	PacienteDAO paciente = lDaoFactoy.getPacienteDAO();
	
	System.out.println("Listing pacientes...");
	Paciente[] pacientes;
	
	try {
		pacientes = paciente.listPacienteByQuery(null, null);
		int length = pacientes.length;
		System.out.println(length + " record(s) encontrados.");

		for (int contar = 0; contar < length; contar++) {
			HashMap<String, Object> mapPacientes = new HashMap<String, Object>();
			mapPacientes.put("rut", pacientes[contar].getRut());
			mapPacientes.put("nombre", pacientes[contar].getNombre());
			mapPacientes.put("direccion", pacientes[contar].getDireccion());
			listaPacientes.add(mapPacientes);
		}

	} catch (PersistentException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}

	Gson gson = new Gson();
	resultJSON = gson.toJson(listaPacientes);
	return resultJSON;
}

/**
 * Elimina un paciente de la base de datos segun su rut.
 * Este usuaro se eliminara en cascada con todos sus datos (en caso de tenerlos) en la tabla registro.
 * @param rutPaciente rut paciente
 * @return 1 transaccion completada, 0 rollback.
 */
public int eliminarPaciente(String rutPaciente)
{
	int resultado =0;
	if(rutPaciente.length()>0){
		PersistentTransaction transaccion = null;
		try {
			System.out.println("transaccion iniciada..");
			transaccion = PrestacionesClinicasPersistentManager.instance().getSession().beginTransaction();
			DAOFactory lDaoFactoy = DAOFactory.getDAOFactory();
			Paciente paciente = lDaoFactoy.getPacienteDAO().getPacienteByORMID(rutPaciente);
			lDaoFactoy.getPacienteDAO().delete(paciente);
			resultado = 1;
			transaccion.commit();
			System.out.println("transaccion terminada..");
		} catch (PersistentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			try {
				transaccion.rollback();
				resultado = 0;
			} catch (PersistentException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
	}

	return resultado;
}


}
